package ar.edu.utn.frba.proyecto.seleccion;

import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frba.proyecto.interfaces.Funcionable;
import ar.edu.utn.frba.proyecto.interfaces.Seleccionable;

public class Ruleta implements Seleccionable {

	@Override
	public Byte[][] seleccionar(Byte[][] info, int cantidadElementosSalida,
			Funcionable func) {
		Byte[][] result= new Byte[cantidadElementosSalida][];
		List<Double> valores= new ArrayList<Double>();
		double acum=0d;
		for (int i = 0; i < info.length; i++) {
			acum+=func.funcion(info[i]);
			valores.add(func.funcion(info[i]));
		}
		List<Double> limites= new ArrayList<Double>();
		double limite=0d;
		for (int i = 0; i<valores.size(); i++){
			limite+=valores.get(i).doubleValue()/acum;
			limites.add(limite);
		}
		for (int i=0; i<cantidadElementosSalida; i++){
			double random=Math.random();
			for (int j=0; j<limites.size(); j++){
				if (random<limites.get(j).doubleValue()){
					result[i]=info[j];
					break;
				}
			}
			if (random>limites.get(limites.size()-1)){
				result[i]=info[limites.size()-1];			}
		}
		return result;
	}

}
